package main

import (
	"fmt"
	"runtime"
)

// 获取正在运行的函数名
func runFuncName() string {
	pc := make([]uintptr, 1)
	runtime.Callers(2, pc)
	f := runtime.FuncForPC(pc[0])
	return f.Name()
}

func test1() {
	i := 0
	fmt.Println("i =", i)
	fmt.Println("FuncName1 =", runFuncName())
}

func test2() {
	i := 1
	fmt.Println("i =", i)
	fmt.Println("FuncName2 =", runFuncName())
}

func test3() {
	foo()
}

func foo() {
	fmt.Printf("我是 %s, %s 在调用我!\n", printMyName(), printCallerName())
	bar()
}

func bar() {
	fmt.Printf("我是 %s, %s 在调用我!\n", printMyName(), printCallerName())
}

func printMyName() string {
	pc, file, line, _ := runtime.Caller(1)
	fmt.Printf("file&line: %s:%d\n", file, line)
	// fmt.Println("file&line:", file, ":", line)
	return runtime.FuncForPC(pc).Name()
}
func printCallerName() string {
	pc, file, line, _ := runtime.Caller(2)
	// fmt.Println("file&line:", file, ":", line)
	fmt.Printf("file&line: %s:%d\n", file, line)
	return runtime.FuncForPC(pc).Name()
}

func main() {
	fmt.Println("打印运行中的函数名：")
	test1()
	test2()
	test3()
}
